﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using System.Linq;
using System.IO;

namespace Feniks
{
    public partial class frmEtiketBasimi : DevExpress.XtraEditors.XtraForm
    {
        private int ToplamKoliMiktari = 0;

        public frmEtiketBasimi()
        {
            InitializeComponent();
            try
            {
                if (!string.IsNullOrEmpty(Program.Session[Settings.ScalePort].ToString()))
                {
                    serialPort1.PortName = Program.Session[Settings.ScalePort].ToString();
                    serialPort1.Open();
                    this.FormClosed += (ss, oo) =>
                    {
                        File.WriteAllText(Application.StartupPath + "\\sonacilis.txt", string.Format("{0};{1};{2}", cmbEtiketTipi.SelectedIndex, cmbIsEmri.SelectedIndex, cmbMakine.SelectedIndex));
                        if (serialPort1.IsOpen)
                            serialPort1.Close();
                    };
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


        delegate void SetTextCallback(string text);
        private void SetText(string text)
        {
            if (this.txtBurut.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                this.txtBurut.Text = text;
            }
        }

        private void frmEtiketBasimi_Load(object sender, EventArgs e)
        {
            cmbEtiketTipi.Properties.Items.Add("Ürün Etiketi");
            cmbEtiketTipi.Properties.Items.Add("Koli Etiketi");

            using (DataEntities ent = new DataEntities())
            {
                foreach (var item in ent.MakineTanimlari)
                {
                    cmbMakine.Properties.Items.Add(new ComboItem()
                    {
                        Text = item.MakineTanımı,
                        Value = item
                    });
                }

                foreach (var item in ent.KoliDaralari)
                {
                    cmbKoli.Properties.Items.Add(new ComboItem()
                    {
                        Text = item.Adi,
                        Value = item
                    });
                }

                foreach (var item in ent.IsEmriTanimlari)
                {
                    cmbIsEmri.Properties.Items.Add(new ComboItem()
                    {
                        Text = item.IsEmriNo,
                        Value = item
                    });
                }

                foreach (var item in ent.MasuraTanimlari)
                {
                    cmbMasura.Properties.Items.Add(new ComboItem()
                    {
                        Text = item.MasuraAdi,
                        Value = item
                    });
                }
            }

            string son = Application.StartupPath + "\\sonacilis.txt";
            if (File.Exists(son))
            {
                string[] dizi = File.ReadAllText(son).Trim().Split(';');
                if (dizi.Length > 0)
                {
                    int etiket = Cevir.Parse<int>(dizi[0]);
                    int emir = Cevir.Parse<int>(dizi[1]);
                    int makine = Cevir.Parse<int>(dizi[2]);
                    cmbEtiketTipi.SelectedIndex = etiket;

                    if (cmbIsEmri.Properties.Items.Count >= emir)
                        cmbIsEmri.SelectedIndex = emir;

                    if (cmbMakine.Properties.Items.Count >= makine)
                        cmbMakine.SelectedIndex = makine;
                }
            }

            try
            {
                gridControl1.DataSource = Database.List("SELECT     TBLSTSABIT.BARKOD1 AS Barkodu, TBLSTSABIT.STOK_KODU AS [Stok Kodu], dbo.TRK(TBLSTSABIT.STOK_ADI) AS [Stok Adı],TBLSTSABITEK.KULL4N AS [Koli Adedi] FROM         TBLSTSABIT INNER JOIN TBLSTSABITEK ON TBLSTSABIT.STOK_KODU = TBLSTSABITEK.STOK_KODU");
                gridView1.BestFitColumns();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void cmbMasura_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbMasura.SelectedIndex > -1)
            {
                cmbOlcu.Properties.Items.Clear();
                using (DataEntities ent = new DataEntities())
                {
                    MasuraTanimi tanim = (MasuraTanimi)((ComboItem)cmbMasura.SelectedItem).Value;
                    foreach (var item in ent.MasuraOlculeri.Where(x => x.MasuraID == tanim.ID))
                    {
                        cmbOlcu.Properties.Items.Add(new ComboItem()
                        {
                            Text = item.Metre,
                            Value = item
                        });
                    }
                }
            }
        }


        private void EtiketPrint()
        {
            if (cmbEtiketTipi.SelectedIndex == -1)
            {
                MessageBox.Show("Lütfen Etiket tipini seçin !");
                cmbEtiketTipi.ShowPopup();
                return;
            }

            if (cmbMakine.SelectedIndex == -1)
            {
                MessageBox.Show("Lütfen Makineyi seçin !");
                cmbMakine.ShowPopup();
                return;
            }

            if (cmbIsEmri.SelectedIndex == -1)
            {
                MessageBox.Show("Lütfen İş Emrini seçin !");
                cmbIsEmri.ShowPopup();
                return;
            }

            if (gridView1.FocusedRowHandle == -1)
            {
                MessageBox.Show("Lütfen Ürünü seçin !");
                gridView1.Focus();
                return;
            }

            if (Cevir.Parse<decimal>(txtBurut.Text) == 0)
            {
                MessageBox.Show("Etiket yazdırabilmek için tartım yapmalısınız !");
                return;
            }

            if (cmbEtiketTipi.SelectedIndex == 0) //ürün
            {
                if (cmbMasura.SelectedIndex > -1 && cmbOlcu.SelectedIndex > -1)
                {
                    double burutAgirlik = Cevir.Parse<double>(txtBurut.Text);
                    MasuraOlcu olcu = (MasuraOlcu)((ComboItem)cmbOlcu.SelectedItem).Value;
                    double netAgirlik = burutAgirlik - olcu.Gram;
                    txtNet.Text = netAgirlik.ToString("n2");

                    Etiket etk = new Etiket();
                    etk.Barkod = gridView1.GetFocusedRowCellValue(gridView1.Columns[0]).ToString() + ";" + netAgirlik.ToString();
                    etk.BurutAgirlik = burutAgirlik;
                    etk.IsEmri = ((IsEmriTanim)((ComboItem)cmbIsEmri.SelectedItem).Value).IsEmriNo;
                    etk.MakineNo = ((MakineTanim)((ComboItem)cmbMakine.SelectedItem).Value).MakineKodu;
                    etk.NetAgirlik = netAgirlik;
                    etk.Tarih = DateTime.Now.ToShortDateString();
                    etk.UrunKodu = gridView1.GetFocusedRowCellValue(gridView1.Columns[1]).ToString();
                    etk.UrunAdi = gridView1.GetFocusedRowCellValue(gridView1.Columns[2]).ToString();
                    etk.Dara = olcu.Gram;
                    DizaynYazdir(0, etk);
                }
                else
                {
                    MessageBox.Show("Lütfen Masura Ölçüsünü seçin !");
                    cmbMasura.ShowPopup();
                    return;
                }
            }
            else if (cmbEtiketTipi.SelectedIndex == 1) //koli
            {
                if (cmbMasura.SelectedIndex > -1 && cmbOlcu.SelectedIndex > -1)
                {
                    double burutKoliAgirlik = Cevir.Parse<double>(txtBurut.Text);
                    MasuraOlcu olcu = (MasuraOlcu)((ComboItem)cmbOlcu.SelectedItem).Value;
                    double koliAdedi = 0;
                    if (!string.IsNullOrEmpty(txtKoliAdedi.Text))
                    {
                        koliAdedi = Cevir.Parse<double>(txtKoliAdedi.Text);
                    }
                    else
                    {
                        koliAdedi = Cevir.Parse<double>(gridView1.GetFocusedRowCellValue(gridView1.Columns[3]));
                    }
                    double koliDara = ((KoliDara)((ComboItem)cmbKoli.SelectedItem).Value).Agirlik;  //Cevir.Parse<double>(birimler.Rows[0]["BRUTAGIRLIK"]);

                    double netAgirlik = burutKoliAgirlik - ((koliAdedi * olcu.Gram) + koliDara);
                    txtNet.Text = netAgirlik.ToString("n2");

                    Etiket etk = new Etiket();
                    etk.KoliIciAdet = koliAdedi;
                    etk.Barkod = gridView1.GetFocusedRowCellValue(gridView1.Columns[0]).ToString() + ";" + netAgirlik.ToString();
                    etk.BurutAgirlik = burutKoliAgirlik;
                    etk.IsEmri = ((IsEmriTanim)((ComboItem)cmbIsEmri.SelectedItem).Value).IsEmriNo;
                    etk.MakineNo = ((MakineTanim)((ComboItem)cmbMakine.SelectedItem).Value).MakineKodu;
                    etk.NetAgirlik = netAgirlik;
                    etk.Tarih = DateTime.Now.ToShortDateString();
                    etk.UrunKodu = gridView1.GetFocusedRowCellValue(gridView1.Columns[1]).ToString();
                    etk.UrunAdi = gridView1.GetFocusedRowCellValue(gridView1.Columns[2]).ToString();
                    etk.Dara = koliDara;
                    etk.Miktar = ToplamKoliMiktari + 1;
                    DizaynYazdir(1, etk);
                    ToplamKoliMiktari += 1;
                }
                else
                {
                    MessageBox.Show("Lütfen Masura Ölçüsünü seçin !");
                    cmbMasura.ShowPopup();
                    return;
                }
            }
        }

        private void DizaynYazdir(byte tip, Etiket etk)
        {
            string filename = Application.StartupPath + "\\etiket" + tip + ".prn";
            using (DataEntities ent = new DataEntities())
            {
                var sonuc = ent.Tasarimlar.Where(x => x.Tip == tip).FirstOrDefault();
                if (sonuc != null)
                {
                    File.WriteAllBytes(filename, sonuc.Data);
                }

                FastReport.Report rp = new FastReport.Report();
                if (File.Exists(filename))
                {
                    rp.Load(filename);
                    BindingSource src = new BindingSource { DataSource = etk };
                    rp.RegisterData(src, "Invoice", 10);
                    rp.GetDataSource("Invoice").Enabled = true;
                    if (tip == 1)
                    {
                        rp.PrintSettings.Printer = Program.Session[Settings.RafEtiketiYazici].ToString();
                    }
                    else
                    {
                        rp.PrintSettings.Printer = Program.Session[Settings.UrunEtiketiYazici].ToString();
                    }

                    rp.PrintSettings.ShowDialog = false;
                    rp.Print();

                    HareketEkle(etk, tip);
                }
            }
        }


        private void HareketEkle(Etiket etk, byte etiketTipi)
        {
            using (DataEntities ent = new DataEntities())
            {
                Hareket hr = new Hareket();
                hr.BurutAgirlik = etk.BurutAgirlik;
                hr.EtiketTipi = etiketTipi;
                hr.IsEmriID = etk.IsEmri;
                hr.NetAgirlik = etk.NetAgirlik;
                hr.Tarih = DateTime.Now;
                hr.UrunKodu = etk.UrunKodu;
                ent.AddToHareketler(hr);
                ent.SaveChanges();
            }
        }


        private void cmbOlcu_SelectedIndexChanged(object sender, EventArgs e)
        {
            double burutAgirlik = Cevir.Parse<double>(txtBurut.Text);
            if (cmbOlcu.SelectedIndex > -1 && burutAgirlik > 0)
            {
                MasuraOlcu olcu = (MasuraOlcu)((ComboItem)cmbOlcu.SelectedItem).Value;
                double netAgirlik = burutAgirlik - olcu.Gram;
                txtNet.Text = netAgirlik.ToString("n2");
            }
        }

        private void btnPrint_Click(object sender, EventArgs e)
        {
            EtiketPrint();
            txtKoliAdedi.Text = "";
        }

        private void txtBurut_EditValueChanged(object sender, EventArgs e)
        {
            double burutAgirlik = Cevir.Parse<double>(txtBurut.Text);
            if (cmbOlcu.SelectedIndex > -1 && burutAgirlik > 0)
            {
                MasuraOlcu olcu = (MasuraOlcu)((ComboItem)cmbOlcu.SelectedItem).Value;
                double netAgirlik = burutAgirlik - olcu.Gram;
                txtNet.Text = netAgirlik.ToString("n2");
            }
        }

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            try
            {
                string data = serialPort1.ReadLine();
                if (!string.IsNullOrEmpty(data) && data.Length > 22)
                {
                    SetText(data.Substring(14, 9).Trim().Replace('.', ','));
                }
            }
            catch (Exception)
            {
            }
        }

        private void frmEtiketBasimi_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {

        }

        private void cmbEtiketTipi_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void cmbIsEmri_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbIsEmri.SelectedIndex > -1)
            {
                try
                {
                    string isemri = ((IsEmriTanim)((ComboItem)cmbIsEmri.SelectedItem).Value).IsEmriNo;
                    using (DataEntities ent = new DataEntities())
                    {
                        ToplamKoliMiktari = ent.Hareketler.Where(x => x.IsEmriID == isemri && x.EtiketTipi == cmbEtiketTipi.SelectedIndex).Select(x => x.ID).Count();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }

        private void simpleButton2_Click(object sender, EventArgs e)
        {
            DialogResult rs = MessageBox.Show("Son yazdırdığınız etiket iptal edilecektir onaylıyormusunuz ?", "Uyarı", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);
            if (rs == System.Windows.Forms.DialogResult.Yes)
            {
                if (cmbIsEmri.SelectedIndex > -1)
                {
                    try
                    {
                        string isemri = ((IsEmriTanim)((ComboItem)cmbIsEmri.SelectedItem).Value).IsEmriNo;
                        using (DataEntities ent = new DataEntities())
                        {
                            var hr = ent.Hareketler.Where(x => x.IsEmriID == isemri && x.EtiketTipi == cmbEtiketTipi.SelectedIndex).OrderByDescending(x => x.ID).FirstOrDefault();
                            if (hr != null)
                            {
                                ent.DeleteObject(hr);
                                ToplamKoliMiktari -= 1;
                            }
                            ent.SaveChanges();
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }
        }

    }
}